# -*- coding: UTF-8 -*-
# Project : zhaobiao
# File : businessname.py
# IDE : PyCharm
# Author : 博科（鑫贝西）田聪
# Date : 2021/11/17 8:30
# 提取企业名称
import re
from tools import loading
import jieba.posseg


# ns前缀 nt前缀 nrt前缀

# 有一总可能，是多个开头标记，这种归到一个里,取第一个
def list_set(ens):
    enss = []
    for en in ens:
        for k, v in enumerate(en):
            if len(v) != 1:
                if en.count(v) > 1:
                    en[k] = ''

        enss.append(''.join(en))
    return list(set(enss))


def extract(string: str):
    # 宁波仲冠会计师事务所有限公司、中冠工程管理咨询有限公司(联合体)
    # 公司分公司
    # 北京大学医院
    # 深圳大学总医院
    # 北京大学附属医院 ns ed b ed
    #   地区 结尾 区别词 结尾
    # 广西国脉科技发展有限公司  ns  n  n  vn ed
    # 上汽大通汽车有限公司    j nz n ed
    # 中国电信集团系统集成有限责任公司广西分公司

    # 上海宏石/上海宏石医疗科技有限公司 还需要去重
    # 东联哈尔/北京东联哈尔仪器制造有限公司
    # 德林义肢矫形康复器材（武汉）有限公司湖南分公司
    # 热电实验设备有限公司奥斯特罗德分公司
    # 江西江铃汽车集团改装车销售服务有限公司 集团
    # 新海创嘉美（北京）工程科技有限公司 双ns
    if type(string) == int:
        return []
    ens = []
    string_fc = jieba.posseg.lcut(string)

    flag = False  # 企业名开头
    en = []  # 企业名称段

    _en_init_ju = True  # 判断企业开头，True为地区开头，False为名称开头
    _en_end_ju = 2  # 判断企业结尾，0为分公司结尾，1为其他结尾，2为没有结尾

    _en = []  # 企业名称段
    for i in string_fc:

        # 有一种 分公司的名称和

        if i.flag in ['sts', 'nt', 'nrt', 'ns'] and not flag:

            # 开头 和 目前还没有企业开头
            flag = True
            if i.flag != 'ns':
                _en_init_ju = False
            else:
                _en_init_ju = True

        # 企业开头为地区 和 当前字符标签为企业名称开头标签
        if _en_init_ju and i.flag in ['sts', 'nt', 'nrt', 'and']:
            # 企业开头 则变更为名称开头
            _en_init_ju = False

        # 预存的企业名称不为空 当前字符标签为结尾  已经取到一个企业名称
        # 用来处理附属
        # 类似 北京大学附属中心医院
        if len(en) == 0 and i.flag in ['wed', 'ed', 'zed'] and len(ens) != 0:
            # flag == False
            # en = []
            if len(_en) > len(en):
                ens[-1] += _en + [i.word]
                _en_end_ju = 2
                _en = []
                continue
            else:
                ens[-1] += [i.word]
                _en = []
                _en_end_ju = 1
                continue

        if _en_end_ju != 2:
            _en.append(i.word)

        if len(en) > 1:

            if _en_init_ju and len(en) > 3:
                # 如果企业名称为地区开头
                if len(en) > 6:
                    en = []
                if i.flag == 'ns' and jieba.posseg.lcut(en[-1])[0].flag not in ['ed', 'wed', 'zed']:
                    # 但是有 绵阳中信科瑞科技 ns/nt
                    # 开头 和 当前企业名称中没有企业后缀
                    #       开头    当前
                    # 例子： 山东    河北好家伙
                    # 垃圾数据
                    en = []
                # 判断是否是两个地区打头：
                # en [ 山东    济南]
                # en [山东 ！= 有限公司 ]

        if flag:

            # 已经取到企业名称的开头

            en.append(i.word)

            if len(ens) != 0:
                # 如果已经录入了一家企业
                # 判断是否还有另外的结尾

                # 上一家企业的结尾

                _up_en_end_flag = jieba.posseg.lcut(ens[-1][-1])[-1].flag

                # 判断起始结尾
                # wed ： 必定结尾，ed：终端结尾前面可能还有结尾，zed：起始结尾，按理说前面没有其他结尾
                # wed处理

                if i.flag == 'wed' and _up_en_end_flag in ['ed', 'zed']:
                    _en_end_ju = 1
                    ens[-1] += en
                    en = []
                    _en = []
                    flag = False
                    continue
                # ed处理
                elif _up_en_end_flag == 'zed' and i.flag in ['ed', 'wed'] and len(_en) > len(en):
                    _en_end_ju = 1
                    # 当中间间隔太长
                    if len(_en) < 5:
                        ens[-1] += _en
                    else:
                        ens.append(en)
                    en = []
                    _en = []
                    flag = False
                    continue
                elif i.flag == 'ed' and _up_en_end_flag == 'zed':
                    _en_end_ju = 1
                    ens[-1] += en
                    en = []
                    _en = []
                    flag = False
                    continue

                # zed处理
                elif i.flag == _up_en_end_flag == 'zed':
                    _en_end_ju = 1
                    ens[-1] += en
                    en = []
                    _en = []
                    flag = False
                    continue

                # 相同结尾
                elif i.flag == _up_en_end_flag:
                    _en_end_ju = 1
                    ens.append(en)
                    en = []
                    _en = []
                    flag = False
                    continue

                #
                elif i.flag in ['ed', 'zed'] and _up_en_end_flag == 'wed':
                    _en_end_ju = 1
                    ens.append(en)
                    en = []
                    _en = []
                    flag = False
                    continue

            else:
                # 当企业列表中什么都没有的时候
                if i.flag in ['zed', 'ed', 'wed']:
                    # 存入
                    _en_end_ju = 1
                    ens.append(en)
                    # 清空
                    en = []
                    _en = []
                    flag = False

    # 企业名称去重
    return list_set(ens)


if __name__ == '__main__':
    # for i in ['四川祈胜科技有限公司,四川德裕昌贸易有限公司', 0, 0]:
    # 黑龙江大学 测试
    # 四川省重点实验室专用设备:绵阳中信科瑞科技有限公司
    # 华东医药股份有限公司器材化剂分公司
    # 河北省金准医院管理有限公司
    # ['河北省金准医院']
    # 通辽光远电力安装有限责任公司科左后旗分公司
    # 南京东南大学城市规划设计研究院有限公司
    # ['城市规划设计研究院', '南京东南大学']
    # 中国环境科学研究院环境技术工程有限公司
    # ['中国环境科学研究院', '技术工程有限公司']
    print([i.flag for i in jieba.posseg.lcut('有限公司、中冠工程管理咨询有限公司(联合体)')])
    # print(extract('优质食用菌生产基地建设项目二次汤阴县众诚电子有限公司'))
